/*
继承属于非常重要的内容。在定义不同类的时候存在一些相同属性，为了方便可以使用，可以将这些共同属性抽象成一个父类，
在定义其他类时继承该父类，减少代码的重复定义，子类可以使用父类中非私有的成员，其实子类也继承了父类的私有属性，在后面学反射的时候会证明
子类具有父类的全部属性，protected可见但外部无法使用，包括private属性不可见无法使用，子类还可以有自己的方法
继承只能继承一个父类，不支持多继承

所有的类都继承自Object类，Object类是最顶层的类，自jdk1.0就有了，属于java.lang包下面，java.lang包下的类都是自己导入的，
所有object的子类都有object的方法，比如hashCode(),getClass()等
 */

package com.test.Encapsulation_Inheritance_Polymorphism;

/*
现在学生分为两种，体育生和艺术生，他们都是学生分支，但他们都有自己的方法
 */
public class SportStudent extends Student{  //使用extends继承父类
    //提示There is no default constructor available in 'com.test.Encapsulation.Student'
    //每一个子类继承父类的话，必须要在子类里实现父类的构造方法。父类的构造方法定义了一个name和age，子类继承时，
    // 也要定义构造方法，传入name和age，把父类的构造方法完成，再去做自己的事情
    //因为我们把Student的默认构造方法改了，所以有这个提示，如果没修改父类默认的构造方法就不用super手动指明

    public SportStudent(String name, int age){
//        System.out.println("test");  super调用必须是构造函数主题中的第一句。代码执行在super实现父类构造方法执行，报错。
        super(name,age);  //super调用父类的构造方法，super这里和this的意义一样，super代表的是父类，间接的调用父类的构造方法了，this代表的是当前的类。
        System.out.println("我是体育生");  //完成父类的构造方法后，就可以执行其他的代码了，如果放在super调用父类的构造方法之前执行其他命令会报错。

//        baohu(); //可以调用父类的protect方法
    }

    public void exercise(){  //体育生子类自己的方法
        System.out.println("我超勇的");
    }

    //子类的study
    @Override  //使用Override注解声明这个方法是重写的，但也可以不要，我们现阶段不接触
    public void study(){  //重写Sdudent父类里的study方法
        System.out.println("我不爱运动，爱打游戏，打游戏使我沉迷");
    }

}
